package com.study.spmongodb.book.wwj.char20;

import java.util.LinkedList;

/**
 * @author MI
 * @version 1.0
 * @date 2020/11/30 10:24
 */
class GuardedSuspensionQueue {
    //定义存放Integer类型的queue
    private final LinkedList<Integer> queue = new LinkedList<>();

    //定义queue的大容量 为100
    private final int LIMIT = 100;

    //往queue中插入数据，如果queue，中的元素操作了最大容量，则会陷入阻塞
    public void offer(Integer data) throws InterruptedException {
        synchronized (this) {
            //判断queue的当前元素是否超过了LIMIT
            while (queue.size() >= LIMIT) {
                //挂起当前线程，使其陷入阻塞
                this.wait();
            }
            //插入元素并且唤醒 take
            queue.addLast(data);
            this.notifyAll();
        }
    }

    public Integer take() throws InterruptedException {

        synchronized (this) {
            //判断队列为空
            while (queue.isEmpty()) {
                //挂起当前线程
                System.out.println("队列为空，挂起线程");
                this.wait();
            }
            //通知offer线程可可以继续插入数据了
            this.notifyAll();
            return queue.removeFirst();
        }
    }
}
